import numpy as np
import matplotlib.pyplot as plt

# 设置matplotlib以支持中文显示
plt.rcParams['font.sans-serif'] = ['SIMHEI']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号

# 设置参数
base_lambda = 2  # 基准情况下，平均每小时修复2个错误报告（复杂度最低时）
complexity_std_dev = 0.5  # 复杂度的标准差，用于生成复杂度的随机变量
num_simulations = 1000  # 模拟的错误报告数量

# 生成复杂度因子，假设复杂度服从正态分布，均值为1，标准差为complexity_std_dev
complexity_factors = np.random.normal(1, complexity_std_dev, num_simulations)

# 确保复杂度因子为正数（因为修复时间不应该因为复杂度而减少）
complexity_factors = np.abs(complexity_factors) + 1e-6  # 加一个小数以避免除零错误

# 根据复杂度因子调整lambda值，复杂度越高，lambda值越小（修复时间越长）
adjusted_lambdas = base_lambda / complexity_factors

# 模拟修复时间
repair_times = np.random.exponential(1 / adjusted_lambdas, num_simulations)

# 计算均值和方差
mean_repair_time = np.mean(repair_times)
variance_repair_time = np.var(repair_times)

# 打印结果
print(f"模拟的平均修复时间: {mean_repair_time:.2f} 小时")
print(f"模拟的方差: {variance_repair_time:.2f} 小时平方")

# 注意：由于引入了复杂度因子，理论上的平均修复时间和方差不再是一个固定的值，
# 而是依赖于复杂度的分布。因此，这里不再打印理论上的平均值和方差。

# 可视化模拟数据
plt.hist(repair_times, bins=30, density=True, alpha=0.6, color='g')
plt.title('考虑问题复杂程度后的软件错误修复时间模拟分布')
plt.xlabel('修复时间 (小时)')
plt.ylabel('概率密度')
plt.show()